package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.UUID;

/**
 * @author 刘昱江
 * 时间 2021/5/11
 */
@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }

    /*
    * 需求:
    *       1.根据用户名和密码查询数据库
    *       2.将密码进行加密处理   md5加密方式
    *       3.如果用户名和密码正确  返回token
    *       4.token独一无二的字符串   UUID  每次生成的UUID几乎不重复    数据库select  UUID();
    * */

  /*  @Override
    public String login(User user) {
        //1.将密码进行加密处理
        String password  = user.getPassword();//此时是用户输入的明文密码
        //将字符串转化为字节数组
        byte[]  passByte =  password.getBytes() ;
        //将明文加密
        String  md5Pass  = DigestUtils.md5DigestAsHex(passByte);
        //根据用户名和密码查询数据库
        //sql: select * from user where uname="xxx"and ps="xx"
        //根据对象中不为null的属性充当where条件
        user.setPassword((md5Pass));
        QueryWrapper<User> queryWrapper =new QueryWrapper<>(user);
        //从数据库中获取结果
        User userDB =userMapper.selectOne(queryWrapper);
        //检查结果是否有效
        //
        if(userDB == null){//此时用户名和密码错误,返回null
            return  null;//业务流程结束
        }
        //此时运行到这里,用户输入的账号密码正确,返回token
        String token = UUID.randomUUID().toString().replace("-", "");
        return token;
    }*/
    @Override
    public String login(User user) {
        String password =user.getPassword();
        byte[] passByte = password.getBytes();
        String md5Pass = DigestUtils.md5DigestAsHex(passByte);
        user.setPassword(md5Pass);
        QueryWrapper<User>queryWrapper =new QueryWrapper<>(user);
        User userDB  = userMapper.selectOne(queryWrapper);
        if(userDB==null){
            return  null;
        }
        String token =UUID.randomUUID().toString().replace("-","");

        return  token;
    }

    @Override
    public PageResult getUserList(PageResult pageResult) {
     /*   int start = (pageResult.getPageNum()-1)*pageResult.getPageSize();
        int size =pageResult.getPageSize();
        List<User> userList = userMapper.findUserListByPage(start, size);
        long total = userMapper.selectCount(null);
        return pageResult.setTotal(total).setRows(userList);*/
        
        int  pageNum= pageResult.getPageNum();
        int pageSize=pageResult.getPageSize();
        Page <User> page = new Page(pageNum, pageSize);
        QueryWrapper<User>queryWrapper = new QueryWrapper<>();
        boolean flag= StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag,"username",pageResult.getQuery());
        page = userMapper.selectPage(page, queryWrapper);
        List<User> userList = page.getRecords();
        long total = page.getTotal();
        pageResult.setTotal(total).setRows(userList);
        return pageResult;
    }

    /**
     * 需求:进行分页查询,总数,分页后的结果
     * 知识铺垫  每页20条
     *第N页:
     *  select * from user limit (n-1)*rows,rows
     * 方法实现:1手写sql
     *        2.利用MP方式实现
     */

    /*@Override
    public PageResult getUserList(PageResult pageResult) {

        //根据参数动态的执行分页查询
        int start = (pageResult.getPageNum()-1)*pageResult.getPageNum();
        int size  =  pageResult.getPageSize();
        List<User> userList= userMapper.findUserListByPage(start,size);
        long  total= userMapper.selectCount(null);
        return pageResult.setTotal(total).setRows(userList);
    }

    */

    //user对象的有效数据   id=xxxx   status =true/false
    @Override
    public void updateStatus(User user) {
        //根据   其中不为null的元素当做set条件   id当做唯一的where条件
        userMapper.updateById(user);
    }

    @Override
    public User getUserById(Integer id) {
        return  userMapper.selectById(id);
    }

    @Override
    public void updateUser(User user) {
        userMapper.updateById(user);
    }

    @Override
    public void deleteUserById(Integer id) {
        userMapper.deleteById(id);
    }

    /*
    * 以MP的方式分页查询
    * 需求
    *    1.分页查询List<user>
    *    2.获取记录总数  封装  pageResult对象
    *
    *
    * */
    /*@Override
    public PageResult getUserList(PageResult pageResult) {
        //第一部分   实现数据的封装
        //将页面条目数量   定义为pageNum
       int pageNum = pageResult.getPageNum();
       int pageSize = pageResult.getPageSize();
        //参数1   page分页对象
        Page<User> page = new   Page(pageNum,pageSize);
        //参数2  分页查询条件  username模糊查询
        //问题:  如果用户没有传递query
        // like关键字 拼接参数
        //动态拼接  :  传参拼接like
        // condition:true  拼接like条件
        //condition:false    不拼接like关键字
        //query 用户查询的数据 String  可以为null
        QueryWrapper queryWrapper = new QueryWrapper();
        //判断用户时候传参  如果传参  返回true  反之  返回false
        boolean flag = StringUtils.hasLength(pageResult.getQuery());
        queryWrapper.like(flag,"username",pageResult.getQuery());

        //规则  :page2个参数   根据分页查询返回 total/分页后的记录   共4个参数
        page = userMapper.selectPage(page,queryWrapper);
        List<User>  userList = page.getRecords();
        long total = page.getTotal();
        pageResult.setTotal(total).setRows(userList);
        return   pageResult;


    }*/

}

















